home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / sun / misc / FDBigInt.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  4.2 KB  |  405 lines

  1. package sun.misc;
  2.  
  3. class FDBigInt {
  4.    int nWords;
  5.    int[] data;
  6.  
  7.    public FDBigInt(int var1) {
  8.       this.nWords = 1;
  9.       this.data = new int[1];
  10.       this.data[0] = var1;
  11.    }
  12.  
  13.    public FDBigInt(long var1) {
  14.       this.data = new int[2];
  15.       this.data[0] = (int)var1;
  16.       this.data[1] = (int)(var1 >>> 32);
  17.       this.nWords = this.data[1] == 0 ? 1 : 2;
  18.    }
  19.  
  20.    public FDBigInt(FDBigInt var1) {
  21.       this.data = new int[this.nWords = var1.nWords];
  22.       System.arraycopy(var1.data, 0, this.data, 0, this.nWords);
  23.    }
  24.  
  25.    private FDBigInt(int[] var1, int var2) {
  26.       this.data = var1;
  27.       this.nWords = var2;
  28.    }
  29.  
  30.    public FDBigInt(long var1, char[] var3, int var4, int var5) {
  31.       int var6 = (var5 + 8) / 9;
  32.       if (var6 < 2) {
  33.          var6 = 2;
  34.       }
  35.  
  36.       this.data = new int[var6];
  37.       this.data[0] = (int)var1;
  38.       this.data[1] = (int)(var1 >>> 32);
  39.       this.nWords = this.data[1] == 0 ? 1 : 2;
  40.       int var7 = var4;
  41.       int var8 = var5 - 5;
  42.  
  43.       while(var7 < var8) {
  44.          int var10 = var7 + 5;
  45.  
  46.          int var9;
  47.          for(var9 = var3[var7++] - 48; var7 < var10; var9 = 10 * var9 + var3[var7++] - 48) {
  48.          }
  49.  
  50.          this.multaddMe(100000, var9);
  51.       }
  52.  
  53.       int var12 = 1;
  54.  
  55.       int var11;
  56.       for(var11 = 0; var7 < var5; var12 *= 10) {
  57.          var11 = 10 * var11 + var3[var7++] - 48;
  58.       }
  59.  
  60.       if (var12 != 1) {
  61.          this.multaddMe(var12, var11);
  62.       }
  63.  
  64.    }
  65.  
  66.    public void lshiftMe(int var1) throws IllegalArgumentException {
  67.       if (var1 <= 0) {
  68.          if (var1 != 0) {
  69.             throw new IllegalArgumentException("negative shift count");
  70.          }
  71.       } else {
  72.          int var2 = var1 >> 5;
  73.          int var3 = var1 & 31;
  74.          int var4 = 32 - var3;
  75.          int[] var5 = this.data;
  76.          int[] var6 = this.data;
  77.          if (this.nWords + var2 + 1 > var5.length) {
  78.             var5 = new int[this.nWords + var2 + 1];
  79.          }
  80.  
  81.          int var7 = this.nWords + var2;
  82.          int var8 = this.nWords - 1;
  83.          if (var3 == 0) {
  84.             System.arraycopy(var6, 0, var5, var2, this.nWords);
  85.             var7 = var2 - 1;
  86.          } else {
  87.             int var11;
  88.             int var10002;
  89.             for(var5[var7--] = var6[var8] >>> var4; var8 >= 1; var5[var11] = var10002 | var6[var8] >>> var4) {
  90.                var11 = var7--;
  91.                var10002 = var6[var8] << var3;
  92.                --var8;
  93.             }
  94.  
  95.             var5[var7--] = var6[var8] << var3;
  96.          }
  97.  
  98.          while(var7 >= 0) {
  99.             var5[var7--] = 0;
  100.          }
  101.  
  102.          this.data = var5;
  103.  
  104.          for(this.nWords += var2 + 1; this.nWords > 1 && this.data[this.nWords - 1] == 0; --this.nWords) {
  105.          }
  106.  
  107.       }
  108.    }
  109.  
  110.    public int normalizeMe() throws IllegalArgumentException {
  111.       int var2 = 0;
  112.       int var3 = 0;
  113.       int var4 = 0;
  114.  
  115.       int var1;
  116.       for(var1 = this.nWords - 1; var1 >= 0 && (var4 = this.data[var1]) == 0; --var1) {
  117.          ++var2;
  118.       }
  119.  
  120.       if (var1 < 0) {
  121.          throw new IllegalArgumentException("zero value");
  122.       } else {
  123.          this.nWords -= var2;
  124.          if ((var4 & -268435456) != 0) {
  125.             for(var3 = 32; (var4 & -268435456) != 0; --var3) {
  126.                var4 >>>= 1;
  127.             }
  128.          } else {
  129.             while(var4 <= 1048575) {
  130.                var4 <<= 8;
  131.                var3 += 8;
  132.             }
  133.  
  134.             while(var4 <= 134217727) {
  135.                var4 <<= 1;
  136.                ++var3;
  137.             }
  138.          }
  139.  
  140.          if (var3 != 0) {
  141.             this.lshiftMe(var3);
  142.          }
  143.  
  144.          return var3;
  145.       }
  146.    }
  147.  
  148.    public FDBigInt mult(int var1) {
  149.       long var2 = (long)var1;
  150.       int[] var4 = new int[var2 * ((long)this.data[this.nWords - 1] & 4294967295L) > 268435455L ? this.nWords + 1 : this.nWords];
  151.       long var5 = 0L;
  152.  
  153.       for(int var7 = 0; var7 < this.nWords; ++var7) {
  154.          var5 += var2 * ((long)this.data[var7] & 4294967295L);
  155.          var4[var7] = (int)var5;
  156.          var5 >>>= 32;
  157.       }
  158.  
  159.       if (var5 == 0L) {
  160.          return new FDBigInt(var4, this.nWords);
  161.       } else {
  162.          var4[this.nWords] = (int)var5;
  163.          return new FDBigInt(var4, this.nWords + 1);
  164.       }
  165.    }
  166.  
  167.    public void multaddMe(int var1, int var2) {
  168.       long var3 = (long)var1;
  169.       long var5 = var3 * ((long)this.data[0] & 4294967295L) + ((long)var2 & 4294967295L);
  170.       this.data[0] = (int)var5;
  171.       var5 >>>= 32;
  172.  
  173.       for(int var7 = 1; var7 < this.nWords; ++var7) {
  174.          var5 += var3 * ((long)this.data[var7] & 4294967295L);
  175.          this.data[var7] = (int)var5;
  176.          var5 >>>= 32;
  177.       }
  178.  
  179.       if (var5 != 0L) {
  180.          this.data[this.nWords] = (int)var5;
  181.          ++this.nWords;
  182.       }
  183.  
  184.    }
  185.  
  186.    public FDBigInt mult(FDBigInt var1) {
  187.       int[] var2 = new int[this.nWords + var1.nWords];
  188.  
  189.       for(int var3 = 0; var3 < this.nWords; ++var3) {
  190.          long var4 = (long)this.data[var3] & 4294967295L;
  191.          long var6 = 0L;
  192.  
  193.          int var8;
  194.          for(var8 = 0; var8 < var1.nWords; ++var8) {
  195.             var6 += ((long)var2[var3 + var8] & 4294967295L) + var4 * ((long)var1.data[var8] & 4294967295L);
  196.             var2[var3 + var8] = (int)var6;
  197.             var6 >>>= 32;
  198.          }
  199.  
  200.          var2[var3 + var8] = (int)var6;
  201.       }
  202.  
  203.       int var9;
  204.       for(var9 = var2.length - 1; var9 > 0 && var2[var9] == 0; --var9) {
  205.       }
  206.  
  207.       return new FDBigInt(var2, var9 + 1);
  208.    }
  209.  
  210.    public FDBigInt add(FDBigInt var1) {
  211.       long var7 = 0L;
  212.       int[] var3;
  213.       int[] var4;
  214.       int var5;
  215.       int var6;
  216.       if (this.nWords >= var1.nWords) {
  217.          var3 = this.data;
  218.          var5 = this.nWords;
  219.          var4 = var1.data;
  220.          var6 = var1.nWords;
  221.       } else {
  222.          var3 = var1.data;
  223.          var5 = var1.nWords;
  224.          var4 = this.data;
  225.          var6 = this.nWords;
  226.       }
  227.  
  228.       int[] var9 = new int[var5];
  229.  
  230.       int var2;
  231.       for(var2 = 0; var2 < var5; ++var2) {
  232.          var7 += (long)var3[var2] & 4294967295L;
  233.          if (var2 < var6) {
  234.             var7 += (long)var4[var2] & 4294967295L;
  235.          }
  236.  
  237.          var9[var2] = (int)var7;
  238.          var7 >>= 32;
  239.       }
  240.  
  241.       if (var7 != 0L) {
  242.          int[] var10 = new int[var9.length + 1];
  243.          System.arraycopy(var9, 0, var10, 0, var9.length);
  244.          var10[var2++] = (int)var7;
  245.          return new FDBigInt(var10, var2);
  246.       } else {
  247.          return new FDBigInt(var9, var2);
  248.       }
  249.    }
  250.  
  251.    public FDBigInt sub(FDBigInt var1) {
  252.       int[] var2 = new int[this.nWords];
  253.       int var4 = this.nWords;
  254.       int var5 = var1.nWords;
  255.       int var6 = 0;
  256.       long var7 = 0L;
  257.  
  258.       int var3;
  259.       for(var3 = 0; var3 < var4; ++var3) {
  260.          var7 += (long)this.data[var3] & 4294967295L;
  261.          if (var3 < var5) {
  262.             var7 -= (long)var1.data[var3] & 4294967295L;
  263.          }
  264.  
  265.          if ((var2[var3] = (int)var7) == 0) {
  266.             ++var6;
  267.          } else {
  268.             var6 = 0;
  269.          }
  270.  
  271.          var7 >>= 32;
  272.       }
  273.  
  274.       assert var7 == 0L : var7;
  275.  
  276.       assert dataInRangeIsZero(var3, var5, var1);
  277.  
  278.       return new FDBigInt(var2, var4 - var6);
  279.    }
  280.  
  281.    private static boolean dataInRangeIsZero(int var0, int var1, FDBigInt var2) {
  282.       while(true) {
  283.          if (var0 < var1) {
  284.             if (var2.data[var0++] == 0) {
  285.                continue;
  286.             }
  287.  
  288.             return false;
  289.          }
  290.  
  291.          return true;
  292.       }
  293.    }
  294.  
  295.    public int cmp(FDBigInt var1) {
  296.       int var2;
  297.       if (this.nWords > var1.nWords) {
  298.          int var3 = var1.nWords - 1;
  299.  
  300.          for(var2 = this.nWords - 1; var2 > var3; --var2) {
  301.             if (this.data[var2] != 0) {
  302.                return 1;
  303.             }
  304.          }
  305.       } else if (this.nWords < var1.nWords) {
  306.          int var5 = this.nWords - 1;
  307.  
  308.          for(var2 = var1.nWords - 1; var2 > var5; --var2) {
  309.             if (var1.data[var2] != 0) {
  310.                return -1;
  311.             }
  312.          }
  313.       } else {
  314.          var2 = this.nWords - 1;
  315.       }
  316.  
  317.       while(var2 > 0 && this.data[var2] == var1.data[var2]) {
  318.          --var2;
  319.       }
  320.  
  321.       int var6 = this.data[var2];
  322.       int var4 = var1.data[var2];
  323.       if (var6 < 0) {
  324.          return var4 < 0 ? var6 - var4 : 1;
  325.       } else {
  326.          return var4 < 0 ? -1 : var6 - var4;
  327.       }
  328.    }
  329.  
  330.    public int quoRemIteration(FDBigInt var1) throws IllegalArgumentException {
  331.       if (this.nWords != var1.nWords) {
  332.          throw new IllegalArgumentException("disparate values");
  333.       } else {
  334.          int var2 = this.nWords - 1;
  335.          long var3 = ((long)this.data[var2] & 4294967295L) / (long)var1.data[var2];
  336.          long var5 = 0L;
  337.  
  338.          for(int var7 = 0; var7 <= var2; ++var7) {
  339.             var5 += ((long)this.data[var7] & 4294967295L) - var3 * ((long)var1.data[var7] & 4294967295L);
  340.             this.data[var7] = (int)var5;
  341.             var5 >>= 32;
  342.          }
  343.  
  344.          if (var5 != 0L) {
  345.             for(long var11 = 0L; var11 == 0L; --var3) {
  346.                var11 = 0L;
  347.  
  348.                for(int var9 = 0; var9 <= var2; ++var9) {
  349.                   var11 += ((long)this.data[var9] & 4294967295L) + ((long)var1.data[var9] & 4294967295L);
  350.                   this.data[var9] = (int)var11;
  351.                   var11 >>= 32;
  352.                }
  353.  
  354.                assert var11 == 0L || var11 == 1L : var11;
  355.             }
  356.          }
  357.  
  358.          long var13 = 0L;
  359.  
  360.          for(int var15 = 0; var15 <= var2; ++var15) {
  361.             var13 += 10L * ((long)this.data[var15] & 4294967295L);
  362.             this.data[var15] = (int)var13;
  363.             var13 >>= 32;
  364.          }
  365.  
  366.          assert var13 == 0L : var13;
  367.  
  368.          return (int)var3;
  369.       }
  370.    }
  371.  
  372.    public long longValue() {
  373.       assert this.nWords > 0 : this.nWords;
  374.  
  375.       if (this.nWords == 1) {
  376.          return (long)this.data[0] & 4294967295L;
  377.       } else {
  378.          assert dataInRangeIsZero(2, this.nWords, this);
  379.  
  380.          assert this.data[1] >= 0;
  381.  
  382.          return (long)this.data[1] << 32 | (long)this.data[0] & 4294967295L;
  383.       }
  384.    }
  385.  
  386.    public String toString() {
  387.       StringBuffer var1 = new StringBuffer(30);
  388.       var1.append('[');
  389.       int var2 = Math.min(this.nWords - 1, this.data.length - 1);
  390.       if (this.nWords > this.data.length) {
  391.          var1.append("(" + this.data.length + "<" + this.nWords + "!)");
  392.       }
  393.  
  394.       while(var2 > 0) {
  395.          var1.append(Integer.toHexString(this.data[var2]));
  396.          var1.append(' ');
  397.          --var2;
  398.       }
  399.  
  400.       var1.append(Integer.toHexString(this.data[0]));
  401.       var1.append(']');
  402.       return new String(var1);
  403.    }
  404. }
  405.